/*
 * image.h
 *
 *  Created on: 18 oct. 2011
 *      Author: arthur
 */

#ifndef IMAGE_H_
#define IMAGE_H_

#include <QImage>
#include <QColor>
#include <QList>
#include <string>
#include <stdlib.h>

//#include <boost/archive/xml_oarchive.hpp>

using namespace std;

class Image
{
	Q_ENUMS(couleurHisto)
	Q_ENUMS(luminosite)

	public:

		enum couleurHisto
		{
			rouge = 0, vert = 1, bleu = 2, gris = 3
		};
		enum luminosite
		{
			clair = 10, sombre = 11, median = 12
		};

		//Attributs
		string nom, motClef, chemin;
		bool estGris;
		float ** histogram;
		QImage qImage;

		//Constructeur et Destructeur
		Image();
		virtual ~Image();

		//Accesseurs
		bool getEstGris() const;
		float **getHistogram() const;
		QImage getImage() const;
		string getNom() const;
		void setEstGris(bool estGris);
		void setHistogram(float **histogram);
		void setImage(QImage qImage);
		void setNom(string nom);

		//Focntions Diverses

		/**
		 * \fn void calculHistogram()
		 * \brief Fonction qui calcul les histogram de l'image.
		 */
		void calculHistogram();

		/**
		 * \fn distanceEuclidienne(float ** a, float ** b, enum couleurHisto couleur,
		 *	unsigned int intervalMin, unsigned int intervalMax);
		 * \brief Fonction qui cacul la distance euclidienne moyenne pour une composante et un
		 * interval donné.
		 *
		 * \param a l'hisogramme de la première image, ne peut être NULL.
		 * \param b l'hisogramme de la seconde image, ne peut être NULL.
		 * \param couleurHisto l'enum décrivant la composant considérée, ne peut être NULL.
		 * \param intervalMin la borne inférieur (inclus) de l'interval considéré , ne peut être NULL.
		 * \param intervalMax la borne supérieur (inclus) de l'interval considéré , ne peut être NULL.
		 *
		 * \return Entier positif ou nul, moyenne des distances euclidiennes pour chaque point de
		 * 	l'interval.
		 */
		float distanceEuclidienne(float ** a, enum couleurHisto couleur, unsigned int intervalMin,
				unsigned int intervalMax);

		/**
		 * \fn void convertirEnNiveauDeGris()
		 * \brief Fonction qui converti une image couleur en une image en niveau de Gris.
		 */
		void convertirEnNiveauDeGris();

		/**
		 * \fn distanceEuclidienneLot(float *** lotHistogramme);
		 * \brief Fonction qui cacul pour un lot d'histograme, la distance euclidienne moyenne pour chaque composante
		 * ainsi que sombre et clair.
		 *
		 * \param lotHistogramme le lot d'histogrames
		 *
		 * \return Tableau d'entiers positifs par couple d'image du lot (r,v,b,s,c)
		 */
		int** distanceEuclidienneLot(float *** lotHistogramme);

		couleurHisto couleurDominante();
		luminosite luminositeDominante();
		QList<QList<Image> > classementImage(QList<Image> imageAClasser);
		float ** histogramesMoyen(QList<Image> imageAMoyenner);

		//Sérialisation

                /*template<class Archive>
		void serialize(Archive& ar, const unsigned int version)
		{
			ar & BOOST_SERIALIZATION_NVP(nom) & BOOST_SERIALIZATION_NVP(motClef)
					& BOOST_SERIALIZATION_NVP(chemin) & BOOST_SERIALIZATION_NVP(estGris)
					& BOOST_SERIALIZATION_NVP(histogram);
                }*/

};

unsigned int distanceEuclidienneHistogrammes(Image image1, Image image2);

#endif /* IMAGE_H_ */
